/*
 * @param M                 Faiss(PQFS)搜索参数：子量化器数量
 * @param k_f               Faiss(PQFS)构建参数：邻居节点数
 * @param nbits             Faiss(PQFS)搜索参数：每个子量化器的位数（固定为4）
 * @param bbs               Faiss(PQFS)构建参数：预计算表块大小（32的倍数）
 * @param qbs               Faiss(PQFS)构建参数：向量量化位数（KPRetrieval可选）
 * @param metric            Faiss(PQFS)构建参数：距离度量类型
 * @param index             Faiss(PQFS)量化索引
 * @param refine_index      Faiss(PQFS)精准索引
 */

#ifndef FAISS_PQFS_INDEX_H
#define FAISS_PQFS_INDEX_H

#include "index_base.h"
#include "datasets.h"
#include "config_parser.h"
#include <faiss/IndexPQFastScan.h>
#include <faiss/IndexRefine.h>
#include <memory>

class FaissPQFSIndex : public IndexBase {
public:
    FaissPQFSIndex(const ConfigParser& config);
    ~FaissPQFSIndex();
    virtual void build(const Datasets* data) override;
    virtual void prepare_search() override;
    virtual void search_single(const float* xq, int k, float* distances, int64_t* labels) override;
    virtual void search_batch(const int nq, const float* xq, int k, float* distances, int64_t* labels) override;

private:
    int M;
    int k_f;
    int nbits;
    int bbs;
#ifdef QUANT
    int qbs;
#endif
    faiss::MetricType metric;
    std::unique_ptr<faiss::IndexPQFastScan> index;
    std::unique_ptr<faiss::IndexRefineFlat> refine_index;
    std::string index_path;
    std::string save_or_load;
};

#endif // FAISS_PQFS_INDEX_H